<?php

class OrdensController extends AppController {

    var $name = 'Ordens';
    var $layout = "ajax";
    var $components = array('Interfaz', 'Vista',);
    var $helpers = array('Interfaz', 'Vista', 'Ayuda',);
    var $uses = array('Orden', 'OrdenDetalle', 'Viaje', 'ViajeConcepto', 'Planificacion', 'Afiliado',);

    public function beforeFilter() {
        $this->validar();
    }

    function index($busq = null) {
        $this->permisos_menu_individual('ordenes');
        $this->set('busq', $busq);
        $condiciones['Orden.id >'] = '0';
        $condiciones['Orden.estatus IN'] = array(1, 2);
        $filtros = '';
        if(!empty($this->request->data)){
            $filtros = $this->request->data;
            extract($filtros);
        }
        if(!empty($filtros) && isset($vent_filtro)){
            $this->set('opciones', $this->serializador($filtros, 2));
            if(!empty($ced_rif))
                $condiciones['Afiliado.ced_rif ILIKE'] = "%$ced_rif%";
            if(!empty($nombre))
                $condiciones['Afiliado.nombre ILIKE'] = "%$nombre%";
            if(!empty($nro_factura))
                $condiciones['Orden.nro_factura ILIKE'] = "%$nro_factura%";
            if(!empty($nro_control))
                $condiciones['Orden.nro_control ILIKE'] = "%$nro_control%";
            if(!empty($fecha))
                $condiciones['Orden.fecha'] = "$fecha";
        }
        $data = $this->Orden->find('all', array('conditions' => $condiciones, 'order' => 'Orden.id DESC', 'limit' => MAX_PAGI));
        $mostrar = (count($data) > MAX_PAGI) ? MAX_PAGI : count($data);
        $this->set('data', $data);
        $this->Vista->title("Listado de Relaci&oacute;n de Viajes Encontradas (Mostrando $mostrar de " . count($data) . " Registros Encontrados)");
        if(isset($vent_filtro))
            $this->Vista->cerrar_ventana($vent_filtro);
        //$this->log(1);
    }

    public function nuevo() {
        $this->permisos_accion_individual('ordenes', 'nuevo');
        $listaP = $this->Planificacion->find('list', array('fields' => 'Planificacion.id, Planificacion.codigo', 'conditions' => array('Planificacion.id >' => '0', 'Planificacion.estatus' => 1), 'order' => 'Planificacion.codigo DESC'));
        $this->set('listaPlanificaciones', $listaP);
        $configuracion = $this->Configuracion->find('first', array('fields' => array('valor'), 'conditions' => array('campo' => 'IVA')));
        $this->set('iva', $configuracion['Configuracion']['valor']);
    }

    public function guardar() {
        $this->permisos_accion_individual('ordenes', 'nuevo');
        $data = $this->request->data;
        if (!$this->Vista->empyt($data, array('planificacion_id', 'iva', 'nombre'))) {
            extract($data);
            $validar = 0;
            if (!$this->Vista->verifica_dos('Ordens', 'afiliado_id', 'nro_factura', $afiliado_id, $nro_factura, 'nro_factura')) {
                for ($i = 1; $i <= $data['cant']; $i++) {
                    if (isset(${"agregar$i"}) && !empty(${"agregar$i"}))
                        $validar++;
                }
                if (($validar > 0) && ($data['cant'] > 0)) {
                    $this->Orden->query('BEGIN WORK');

                    $this->Orden->virtualFields['total'] = "CASE WHEN (COUNT(Orden.id) = 0) THEN LPAD(1::text, 4, '0') ELSE LPAD((MAX(RIGHT(Orden.codigo, 4)::int) + 1)::text, 4, '0') END";
                    $this->Orden->order = null;
                    $siguiente = $this->Orden->find('first', array('fields' => array('Orden.total'), 'conditions' => array('EXTRACT(YEAR FROM Orden.fecha) =' => date('Y'), 'Orden.estatus IN' => array(1, 2))));
                    $siguiente = date('Y') . "-" . $siguiente['Orden']['total'];
                    $monto_iva = $this->Configuracion->find('first', array('fields' => array('valor'), 'conditions' => array('campo' => 'IVA')));
                    $iva = (isset($iva) && !empty($iva)) ? $monto_iva['Configuracion']['valor'] : 0;
                    $data['Orden']['afiliado_id'] = $afiliado_id;
                    $data['Orden']['nro_factura'] = $nro_factura;
                    $data['Orden']['nro_control'] = $nro_control;
                    $data['Orden']['codigo'] = $siguiente;
                    $data['Orden']['fecha'] = $fecha;
                    $data['Orden']['iva'] = $iva;
                    $this->Orden->save($data);
                    unset($this->Orden->virtualFields['total']);

                    for ($i = 1; $i <= $data['cant']; $i++) {
                        if (isset(${"agregar$i"}) && !empty(${"agregar$i"})) {
                            $detalle[$i]['OrdenDetalle']['orden_id'] = $this->Orden->id;
                            $detalle[$i]['OrdenDetalle']['viaje_id'] = ${"agregar$i"};
                        }
                    }

                    $verifica = true;

                    if (isset($detalle) && !empty($detalle)) {
                        foreach ($detalle as $indice => $valor) {
                            if (!$this->OrdenDetalle->saveAll($valor)) {
                                $verifica = false;
                                break;
                            }
                        }
                    }

                    if ($verifica) {
                        $this->Orden->query('COMMIT');
                        $this->Vista->mensaje("Guardado Exitosamente", 'EXITO');
                        $this->Vista->cerrar_ventana($vent_nuevo);
                        //$this->log('imprimir');
                    } else {
                        $this->Orden->query('ROLLBACK');
                        $this->Vista->mensaje("Ocurrio un error Guardando", 'ERROR', 'codigo');
                    }
                }
                else
                    $this->Vista->mensaje("Debe agregar al menos un viaje", 'ERROR');
            }
            else
                $this->Vista->mensaje("Nro de factura Duplicado para este Afiliado", 'ERROR');
        }
        else
            $this->Vista->mensaje("Faltan campos requeridos", 'ERROR');
        $this->index();
        $this->render('index');
    }

    public function modificar($id = null) {
        $this->permisos_opcion_individual('ordenes', 'estatus', 'modificar');
        $data = $this->request->data;
        if (!empty($data)) {
            if (!$this->Vista->empyt($data, array('planificacion_id', 'iva', 'nombre'))) {
                extract($data);
                $id = $this->Interfaz->id($id_orden);
                $validar = 0;
                if (!$this->Vista->verifica_dos('Ordens', 'afiliado_id', 'nro_factura', $afiliado_id, $nro_factura, 'nro_factura', $id)) {
                    for ($i = 1; $i <= $data['cant']; $i++) {
                        if (isset(${"agregar$i"}) && !empty(${"agregar$i"}))
                            $validar++;
                    }
                    if (($validar > 0) && ($data['cant'] > 0)) {
                        $this->Orden->query('BEGIN WORK');

                        $monto_iva = $this->Configuracion->find('first', array('fields' => array('valor'), 'conditions' => array('campo' => 'IVA')));
                        $iva = (isset($iva) && !empty($iva)) ? $monto_iva['Configuracion']['valor'] : 0;
                        $data['Orden']['id'] = $id;
                        $data['Orden']['afiliado_id'] = $afiliado_id;
                        $data['Orden']['nro_factura'] = $nro_factura;
                        $data['Orden']['nro_control'] = $nro_control;
                        $data['Orden']['fecha'] = $fecha;
                        $data['Orden']['iva'] = $iva;
                        $this->Orden->save($data);

                        for ($i = 1; $i <= $data['cant']; $i++) {
                            if (isset(${"agregar$i"}) && !empty(${"agregar$i"})) {
                                $detalle[$i]['OrdenDetalle']['orden_id'] = $id;
                                $detalle[$i]['OrdenDetalle']['viaje_id'] = ${"agregar$i"};
                            }
                        }

                        $verifica = true;

                        $this->OrdenDetalle->query("DELETE FROM orden_detalls WHERE orden_id = $id");

                        if (isset($detalle) && !empty($detalle)) {
                            foreach ($detalle as $indice => $valor) {
                                if (!$this->OrdenDetalle->saveAll($valor)) {
                                    $verifica = false;
                                    break;
                                }
                            }
                        }

                        if ($verifica) {
                            $this->Orden->query('COMMIT');
                            $this->Vista->mensaje("Guardado Exitosamente", 'EXITO');
                            $this->Vista->cerrar_ventana($vent_nuevo);
                            //$this->log('imprimir');
                        } else {
                            $this->Orden->query('ROLLBACK');
                            $this->Vista->mensaje("Ocurrio un error Guardando", 'ERROR', 'codigo');
                        }
                    }
                    else
                        $this->Vista->mensaje("Debe agregar al menos un viaje", 'ERROR');
                }
                else
                    $this->Vista->mensaje("Nro de factura Duplicado para este Afiliado", 'ERROR');
            }
            else
                $this->Vista->mensaje("Faltan campos requeridos", 'ERROR');
            $this->index();
            $this->render('index');
        } else {
            $id = $this->Interfaz->id($id);
            if (is_numeric($id)) {
                $resultado = $this->Orden->find('first', array('conditions' => array('Orden.id' => $id)));
                $this->set('data', $resultado);
                $listaP = $this->Planificacion->find('list', array('fields' => 'Planificacion.id, Planificacion.codigo', 'conditions' => array('Planificacion.id >' => '0', 'Planificacion.estatus' => 1), 'order' => 'Planificacion.codigo DESC'));
                $this->set('listaPlanificaciones', $listaP);
                $configuracion = $this->Configuracion->find('first', array('fields' => array('valor'), 'conditions' => array('campo' => 'IVA')));
                $this->set('iva', $configuracion['Configuracion']['valor']);
                $viajes = $this->OrdenDetalle->find('list', array('fields' => array('OrdenDetalle.viaje_id', 'OrdenDetalle.viaje_id'), 'conditions' => array('OrdenDetalle.orden_id' => $id)));
                $this->set('viajes', $viajes);
                $this->viajes_pendientes(null, $resultado['Afiliado']['ced_rif'], $id);
            } else {
                $this->Vista->mensaje("Relaci&oacute;n de Viajes Inv&aacute;lida", 'ERROR');
                $this->render("../" . PRINCIPAL . "/mensajes");
            }
        }
    }

    public function eliminar($id = null) {
        $this->permisos_opcion_individual('ordenes', 'estatus', 'eliminar');
        $id = $this->Interfaz->id($id);
        if (is_numeric($id)) {
            $total = $this->Orden->find('count', array('conditions' => array("Orden.estatus" => 0)));
            $this->Orden->query('BEGIN WORK');
            $data['Orden']['id'] = $id;
            $data['Orden']['nro_factura'] = ++$total;
            $data['Orden']['nro_control'] = $total;
            $data['Orden']['codigo'] = $total;
            $data['Orden']['estatus'] = 0;

            $this->OrdenDetalle->query("DELETE FROM orden_detalls WHERE orden_id = $id");

            if ($this->Orden->save($data)) {
                $this->Orden->query('COMMIT');
                $this->Vista->mensaje("Eliminado Exitosamente", 'EXITO');
                //$this->log('imprimir');
            } else {
                $this->Orden->query('ROLLBACK');
                $this->Vista->mensaje("Ocurrio un error Eliminando", 'ERROR');
            }
        } else {
            $this->Vista->mensaje("Relaci&oacute;n de Viajes Inv&aacute;lida", 'ERROR');
            $this->render("../" . PRINCIPAL . "/mensajes");
        }
        $this->index();
        $this->render('index');
    }
    
     public function filtro() {
        $this->permisos_accion_individual('productos', 'filtro');
        $listaP = $this->Planificacion->find('list', array('fields' => 'Planificacion.id, Planificacion.codigo', 'conditions' => array('Planificacion.id >' => '0', 'Planificacion.estatus' => 1), 'order' => 'Planificacion.codigo DESC'));
        $this->set('listaPlanificaciones', $listaP);
    }

    function pagar($id = null) {
        $this->permisos_opcion_individual('ordenes', 'estatus', 'pagar');
        $id = $this->Interfaz->id($id);
        if (is_numeric($id)) {
            $this->Orden->query('BEGIN WORK');
            $data['Orden']['id'] = $id;
            $data['Orden']['estatus'] = 2;

            $listaViajes = $this->OrdenDetalle->find('list', array('fields' => array('OrdenDetalle.viaje_id', 'OrdenDetalle.viaje_id'), 'conditions' => array('OrdenDetalle.orden_id' => $id)));
            $listaViajes = implode(', ', $listaViajes);
            $this->Viaje->query("UPDATE viajs SET estatus = 2 WHERE id IN ($listaViajes)");

            if ($this->Orden->save($data)) {
                $this->Orden->query('COMMIT');
                $this->Vista->mensaje("Guardado Exitosamente", 'EXITO');
                //$this->log('imprimir');
            } else {
                $this->Orden->query('ROLLBACK');
                $this->Vista->mensaje("Ocurrio un error Guardando", 'ERROR', 'codigo');
            }
        } else {
            $this->Vista->mensaje("Relaci&oacute;n de Viajes Inv&aacute;lida", 'ERROR');
            $this->render("../" . PRINCIPAL . "/mensajes");
        }
        $this->index();
        $this->render('index');
    }

    function reporte_excel($tipo = 'e', $idOrden) {
        $idOrden = $this->Interfaz->id($idOrden);
        if (is_numeric($idOrden)) {
            $this->set('tipo', $tipo);
            $resultado = $this->Orden->find('first', array('conditions' => array('Orden.id' => $idOrden)));
            $this->set('data', $resultado);
            $viajes = $this->OrdenDetalle->find('list', array('fields' => array('OrdenDetalle.viaje_id', 'OrdenDetalle.viaje_id'), 'conditions' => array('OrdenDetalle.orden_id' => $idOrden)));
            $this->set('viajes', $viajes);
            $this->viajes_pendientes(null, $resultado['Afiliado']['ced_rif'], $idOrden);
            $conceptos = $this->ViajeConcepto->find('all', array('fields' => array('Concepto.nombre', 'Concepto.tipo', 'ViajeConcepto.viaje_id', 'ViajeConcepto.monto', 'ViajeConcepto.descripcion'), 'conditions' => array('ViajeConcepto.viaje_id' => $viajes, 'ViajeConcepto.estatus' => 1)));
            $this->set('conceptos', $conceptos);
        }
        else
            echo "ESTAS INTENTANDO VIOLAR LA SEGURIDAD AGROPATRIA";
    }
    
    public function validarFacturaCliente($afiliado = null, $nro_factura = null, $id = null) {
        if (isset($afiliado) && isset($nro_factura)) {
            $afiliado = $this->Interfaz->mayuscula($afiliado);
            $dataAfiliado = $this->Afiliado->find('first', array('fields' => array('Afiliado.id'), 'conditions' => array('Afiliado.ced_rif' => $afiliado)));
            if (!empty($dataAfiliado)) {
                if (isset($id)) {
                    if (!is_numeric($id))
                        $id = $this->Interfaz->id($id);
                    $this->Vista->verifica_dos('Orden', 'afiliado_id', 'nro_factura', $dataAfiliado['Afiliado']['id'], $nro_factura, 'nro_factura', $id);
                }
                else
                    $this->Vista->verifica_dos('Orden', 'afiliado_id', 'nro_factura', $dataAfiliado['Afiliado']['id'], $nro_factura, 'nro_factura');
            }
        }
        $this->render("../" . PRINCIPAL . "/mensajes");
    }

    function viajes_pendientes($idPlanificacion = null, $afiliado = null, $idOrden = null) {
        $resultado = null;
        $dataAfiliado = null;
        if (!empty($afiliado)) {
            $afiliado = $this->Interfaz->mayuscula($afiliado);
            $dataAfiliado = $this->Afiliado->find('first', array('fields' => array('Afiliado.id', 'Afiliado.ced_rif', 'Afiliado.nombre', 'Afiliado.direccion', 'Afiliado.telf'), 'conditions' => array('Afiliado.ced_rif' => $afiliado)));
            if (!empty($dataAfiliado)) {
                $idAfiliado = $dataAfiliado['Afiliado']['id'];
                //$conditionsSubQuery['"Viaje2"."estatus"'] = '1';
                $condicion = '';
                $condicionSubquery = (empty($idOrden)) ? '"OrdenDetalle"."orden_id" = "Orden"."id" AND "Orden"."estatus" IN (1, 2)' : '"OrdenDetalle"."orden_id" = "Orden"."id" AND "Orden"."id" != ' . $idOrden . ' AND "Orden"."estatus" IN (1, 2)';
                $db = $this->Viaje->getDataSource();
                $subQuery = $db->buildStatement(
                        array(
                    'fields' => array('"Viaje2"."id"'),
                    'table' => $db->fullTableName($this->Viaje),
                    'alias' => 'Viaje2',
                    'joins' => array(array('type' => 'INNER',
                            'table' => 'orden_detalls',
                            'alias' => 'OrdenDetalle',
                            'conditions' => '"OrdenDetalle"."viaje_id" = "Viaje2"."id"'),
                        array('type' => 'INNER',
                            'table' => 'ordens',
                            'alias' => 'Orden',
                            'conditions' => $condicionSubquery)
                    ),
                        //'conditions' => $conditionsSubQuery
                        ), $this->Viaje
                );
                $this->Viaje->virtualFields['conceptos'] = 'SELECT SUM(CASE WHEN (c.tipo = 1) THEN (vc.monto) ELSE ((-1.00) * vc.monto) END) AS total FROM viaje_conceptos AS vc INNER JOIN conceptos AS c ON c.id = vc.concepto_id WHERE vc.viaje_id = "Viaje"."id" GROUP BY "Viaje"."id"';
                $condicion .= (!empty($idPlanificacion)) ? ' "PlanificacionDetalle"."planificacion_id" = ' . $idPlanificacion . ' AND' : '';
                $condicion .= (!empty($idAfiliado)) ? ' "PlanificacionDetalle"."afiliado_id" = ' . $idAfiliado . ' AND' : '';
                $subQuery = $condicion . ' "Viaje"."estatus" != 0 AND "Viaje"."id" NOT IN (' . $subQuery . ')';
                $subQueryExpresion = $db->expression($subQuery);
                $condiciones[] = $subQueryExpresion;
                $this->Viaje->recursive = 2;
                $resultado = $this->Viaje->find('all', array('conditions' => $condiciones));
                if (empty($resultado))
                    $this->Vista->mensaje("El Afiliado no posee viajes pendientes", 'ERROR');
                $this->set('afiliado', $dataAfiliado);
            }
            else
                $this->Vista->mensaje("Afiliado no Registrado", 'ERROR');
        }
        $this->set('resultado', $resultado);
    }

}
